package com.xch.sort;

import cn.hutool.core.comparator.CompareUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;

import static cn.hutool.core.util.ArrayUtil.swap;

public class SelectionSort {

//    public static <E extends Comparable> void sort(E[] arr){
//
//        if(ArrayUtil.isEmpty(arr))return;
//
//        for(int i=0;i<arr.length;i++){
//
//            int minIndex = i;
//            for(int j =minIndex+1;j<arr.length;j++){
//                if(CompareUtil.compare(arr[minIndex],arr[j])>0) minIndex = j;
//            }
//
//            swap(arr,minIndex,i);
//        }
//    }



    public static <E extends Comparable> void sort(E[] arr){

        if(ArrayUtil.isEmpty(arr)) return;

        for(int i = arr.length -1;i>=0;i-- ){
            int maxIndex = i;
            for(int j = i-1;j>=0;j--){

                if(CompareUtil.compare(arr[maxIndex],arr[j])>0)maxIndex = j;
            }

            swap(arr,i,maxIndex);

        }
    }




    // 主方法，程序的入口点
    public static void main(String[] args) {


        int [] dataSize ={10000,100000};

        for(int i=0;i<dataSize.length;i++){
            Integer[] array = ArrayGenerate.generateRandomArray(dataSize[i], dataSize[i]);
            SortingHelper.sort("SelectionSort",array);
        }


    }


    @Data
    public static class Student implements Comparable<Student> {
        private String name;
        private int score;

        public Student(String name,int score) {
            this.name = name;

            this.score = score;
        }


        /**
         * @param obj
         * @return
         */
        @Override
        public boolean equals(Object obj) {
            return super.equals(obj);
        }

        /**
         * @param another 要比较的另一个学生对象
         * @return 如果当前学生对象的分数大于另一个学生对象的分数，则返回 1；如果当前学生对象的分数小于另一个学生对象的分数，则返回 -1；如果两个学生对象的分数相同，则比较它们的名字，并返回比较结果
         */
        @Override
        public int compareTo(Student another) {
            // 如果传入的对象为空，则返回-1
            if (ObjectUtil.isNull(another)) {
                return -1;
            }
            // 如果当前对象的分数大于传入对象的分数，返回1
            if (this.score > another.score) {
                return 1;
            }
            // 如果当前对象的分数小于传入对象的分数，返回-1
            if (this.score < another.score) {
                return -1;
            }
            // 如果分数相同，比较名字并返回比较结果
            return name.compareTo(another.name);
        }



    }
}
